package org.javahispano.javacup.tacticas_aceptadas.jcrosas.chuky.futbolista.habilidad;

import java.util.ArrayList;

import org.javahispano.javacup.tacticas_aceptadas.jcrosas.chuky.futbolista.Futbolista;
import org.javahispano.javacup.tacticas_aceptadas.jcrosas.chuky.futbolista.FutbolistaBase;
import org.javahispano.javacup.tacticas_aceptadas.jcrosas.chuky.util.Balon;

/**
 * @author Joan Crosas
 *
 */
public class PaseDefensivo extends PaseOfensivo {

	/**
	 * @param futbolista
	 */
	public PaseDefensivo( Futbolista futbolista ) {
		super( futbolista );
	}


	@Override
	public boolean ejecutar() {
		if( futbolista.balonEncima( futbolista.getVisionPartido().getBalon() ) && futbolista.getIteracionesParaRematar() % 3 == 0) { 
			ArrayList<Futbolista> futbolistas = futbolista.getVisionPartido().getFutbolistas();
			Balon balon = null;
			for( int i = 0; i < futbolistas.size(); i++ ) {
				balon = evaluarPase( futbolistas.get( i ) );
				if( balon != null ) {
					return true;
				}
			}
		}
		return false;
	}
	
	
	private Balon evaluarPase( Futbolista futbolistaDestino ) {
		// descartamos los que no nos interesan
		if( futbolista == futbolistaDestino ||
				futbolista.getPosicion().distancia( futbolistaDestino.getPosicion() ) > FutbolistaBase.DISTANCIA_MAX_PASE_DEFENSIVO ||
				futbolista.getDistanciaPorteriaRival() > futbolistaDestino.getDistanciaPorteriaRival() ) {
			
			return null;
		}
		
		anticipacion = futbolista.getIteracionesParaRematar();
		
		Balon balon = null;
		double anguloBase = futbolista.getPosicion().angulo( futbolistaDestino.getPosicion() );
		double anguloPase = 0;
		
		do {
			if( anticipacion == 0 ) {
				futbolista.getVisionPartido().disminuirRestriccionesPase();
				futbolista.getVisionPartido().disminuirRestriccionesPase();
			}
			
			for( int i = 0; i < 3 && balon == null; i++ ) {
				if( i == 0 ) {
					anguloPase = anguloBase + futbolista.getPrecision() / 2;
					if( futbolista.getPosicion().getX() > futbolistaDestino.getPosicion().getX() ) {
						anguloPase = anguloBase - futbolista.getPrecision() / 2;
					}
				} else if( i == 1 ) {
					anguloPase = anguloBase + FutbolistaBase.DESVIO_ANGULO_PASE;
					if( futbolista.getPosicion().getX() > futbolistaDestino.getPosicion().getX() ) {
						anguloPase = anguloBase - FutbolistaBase.DESVIO_ANGULO_PASE;
					}
				} else if( i == 2 ) {
					anguloPase = anguloBase - futbolista.getPrecision() / 2;
					if( futbolista.getPosicion().getX() > futbolistaDestino.getPosicion().getX() ) {
						anguloPase = anguloBase + futbolista.getPrecision() / 2;
					}
				} 
				
				for( int f = 0; f < FutbolistaBase.POTENCIA_PASE_DEFENSIVO.length && balon == null; f++ ) {
					balon = evaluarPase( futbolistaDestino, anguloPase, FutbolistaBase.POTENCIA_PASE_DEFENSIVO[f], 0 );
				}
			}
			
			if( anticipacion == 0 && balon == null && super.ejecutar() ) {
				balon = new Balon(); // total, com que no es fa res amb aquesta pilota...
			}
		} while( balon == null && anticipacion == 0 && !futbolistaDestino.isRestriccionesPaseMinimas() );
		
		return balon;
	}

}
